package com.btm.btmchat.controller;

import com.btm.btmchat.service.AIService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import org.springframework.http.codec.ServerSentEvent;

/**
 * AI控制器类，提供与AI聊天相关的REST API接口
 */
@RestController
@RequestMapping("/api/ai")
public class AIController {

    private static final Logger log = LoggerFactory.getLogger(AIController.class);
    private final AIService aiService;

    /**
     * 构造函数，注入AIService依赖
     * @param aiService AI服务实例
     */
    public AIController(AIService aiService) {
        this.aiService = aiService;
    }

    /**
     * 简单聊天接口，直接转发用户输入到AI模型
     * @param userInput 用户输入内容
     * @return AI模型的原始响应
     */
    @GetMapping("/chat/simple")
    public String chatWithAI(@RequestParam String userInput) {
        return aiService.simpleChat(userInput);
    }

    /**
     * 使用系统预设提示的聊天接口
     * @param message 用户消息
     * @return 格式化后的天气预报信息(Markdown格式)
     */
    @GetMapping(value = "/chat/tools")
    public String chat(@RequestParam("message") String message,
                       @RequestParam(required = false) String sessionId) {
        log.info("非流式，接收到REST请求提示词：{}，会话ID：{}", message, sessionId);
        return aiService.chatWithSystemPrompt(message, sessionId);
    }


    /**
     * 支持多轮对话的流式聊天接口
     * @param query 用户查询内容
     * @param sessionId 会话ID，如果为空则创建新会话
     * @return 流式AI响应
     */
    @GetMapping(value = "/chat/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<ServerSentEvent<String>> chatStream(
            @RequestParam String query,
            @RequestParam(required = false) String sessionId) {
        log.info("流式，接收到REST请求提示词：{}，会话ID：{}", query, sessionId);
        return aiService.chatStreamWithHistory(sessionId, query)
                .map(msg -> ServerSentEvent.builder("'"+msg).build());
    }


    /**
     * 支持多轮对话的流式聊天接口，支持执行任何类型的SQL
     * @param query 用户查询内容
     * @param sessionId 会话ID，如果为空则创建新会话
     * @return 流式AI响应
     */
    @GetMapping(value = "/chat/stream/all", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<ServerSentEvent<String>> chatStreamAll(
            @RequestParam String query,
            @RequestParam(required = false) String sessionId) {
        log.info("接收到REST请求提示词：{}，会话ID：{}", query, sessionId);
        return aiService.chatStreamAllWithHistory(sessionId, query)
                .map(msg -> ServerSentEvent.builder(msg).build());
    }
    
    /**
     * 清除指定会话的历史记录
     * @param sessionId 会话ID
     * @return 操作结果
     */
    @DeleteMapping("/chat/session/{sessionId}")
    public String clearSession(@PathVariable String sessionId) {
        log.info("清除会话：{}", sessionId);
        aiService.cleanChatHistory(sessionId);
        return "会话已清除";
    }
}